跳到主要内容

使用瓦片地图的功能

  在游戏开发中,瓦片地图是一种常见的场景构建方式。本文将介绍如何使用 Tiled Editor 制作瓦片地图,并利用 Dora SSR 游戏引擎的 TileNode 类来加载和渲染这些地图,以及如何读取地图中的分层数据。

1. Tiled Editor 简介

  Tiled Editor 是一款免费、开源且功能强大的瓦片地图编辑器。它支持多种地图格式和层级,可以方便地创建复杂的游戏场景。主要特点包括:

  • 多平台支持:可在 Windows、macOS、Linux 等操作系统上运行。
  • 灵活的层级系统:支持多层地图编辑,包括瓦片层、对象层和图像层。
  • 丰富的导出格式:支持导出为 JSON、XML、TMX 等多种格式,方便与各种游戏引擎集成。

2. 使用 TileNode 加载和渲染瓦片地图

2.1 准备工作

  首先,确保已安装 Tiled Editor 并制作了一个瓦片地图,导出为 TMX(XML 格式) 文件。例如,我们有一个名为 platform.tmx 的地图文件。

2.2 创建 TileNode 实例

  在 Lua 脚本中,首先需要加载 TileNode 模块,然后创建一个 TileNode 对象。

local TileNode <const> = require("TileNode")

-- 加载整个地图
local tmxNode = TileNode("TMX/platform.tmx")

  如果只想加载特定的图层,可以在创建 TileNode 时指定图层名称:

-- 加载指定的图层
local tmxNode = TileNode("TMX/platform.tmx", "Far")

  或者只加载多个特定的图层:

-- 加载多个图层
local tmxNode = TileNode("TMX/platform.tmx", {"Far", "Near"})

2.3 添加 TileNode 到场景树

  创建好 TileNode 实例后,可以将其添加到特定的场景树中,并可以通过该节点控制瓦片地图的平移、旋转和缩放等操作。

-- 将 TileNode 添加到一个已有的场景中
scene:addChild(tmxNode)

-- 设置瓦片地图的位置和缩放
tmxNode.position = Vec2(100, 100)
tmxNode.scaleX = 2.0
tmxNode.scaleY = 2.0

2.4 读取图层数据

  TileNode 提供了 getLayer 方法,可以根据图层名称获取对应的图层数据。

-- 获取名为 "Objects" 的图层
local layer = tmxNode:getLayer("Objects")

  图层数据以字典(Dictionary)的形式返回,具体内容取决于图层的类型。例如,对于 Tiled 的对象层,可以这样遍历其中的对象。

-- 遍历对象层中的对象
layer.objects:each(function(item)
print("对象:", item.name)
item:each(function(value, key)
print("\t", key, value)
end)
end)

2.5 设置渲染属性

  TileNode 还提供了一些属性,可以控制瓦片地图的渲染效果。

  • depthWrite:是否写入深度缓冲区,默认值为 false
  • blendFunc:混合函数,控制渲染的混合模式。
  • effect:着色器效果,可以为瓦片地图添加特效。
  • filter:纹理过滤模式,控制纹理的显示效果。默认值为 "Point",这个模式比较适合像素风格的游戏地图渲染。

  例如,设置瓦片地图的纹理过滤模式为异向性过滤,使得地图边缘更加平滑:

tmxNode.filter = "Anisotropic"

3. 完整示例

  下面是一个完整的示例,演示如何加载瓦片地图、添加到场景、读取对象层数据并设置渲染属性。

local TileNode <const> = require("TileNode")
local Director <const> = require("Director")

-- 创建 TileNode 实例,加载整个地图
local tmxNode = TileNode("TMX/platform.tmx")

-- 设置纹理过滤模式
tmxNode.filter = "Anisotropic"

-- 将 TileNode 添加到场景中
-- Director.entry 为引擎的场景根节点
-- 如果注释下面代码不做指定也会自动默认添加到这个节点
local scene = Director.entry
scene:addChild(tmxNode)

-- 获取对象层数据
local layer = tmxNode:getLayer("Objects")

-- 遍历对象层中的对象
layer.objects:each(function(item)
print("对象名:", item.name)
print(" 可见属性:", item.visible)
print(" 位置属性:", item.position)
print(" 形状属性:", item.shape)
-- 访问其他属性...
end)

4. 总结

  通过 Dora SSRTileNode 类,我们可以方便地加载和渲染由 Tiled Editor 制作的瓦片地图。同时,可以通过 getLayer 方法获取地图中的图层数据,进行游戏逻辑的处理。利用这些功能,开发者可以高效地构建复杂的瓦片地图游戏场景。